# 正则
import re, json

from django.views import View
# 导入返回响应
from SaaSDevelTool.data_return_response import create_response
# 导入错误信息装饰器
from SaaSDevelTool.data_return_response import error_message_detection
# 导入数据库连接
from SaaSDevelTool.data_mysql_data import db
# 导入加密
from SaaSDevelTool.data_encode import md5_encrypt, aes_encrypt2
# 导入jwt
from SaaSDevelTool.data_jwt_func import jj
# 导入redis
from SaaSDevelTool.data_redis_link import r
# 导入递归函数
from SaaSDevelUserLoginSettings.SaaSDevelUserLoginFunc import get_department_tree

"""
用户登录接口
"""


class SaaSDevelUserLogin(View):
    @error_message_detection
    def post(self, request):
        # 接收用户手机号
        user_mobile = request.POST.get("user_mobile")
        # 接受用户密码
        user_password = request.POST.get("user_password")
        # 判断参数是否传递完整
        if not all([user_mobile, user_password]):
            return create_response(code=400, msg="用户账号与密码为必传项。")

        # 判断手机号格式
        if not re.findall(r"^1[3-9]\d{9}$", user_mobile):
            return create_response(code=400, msg="手机号格式错误")

        # 判断是否存在当前账户信息
        query_base_info_user_table_sql = """
            SELECT 
                user_id, 
                user_name, 
                user_pwds, 
                user_role_id,
                user_status, 
                user_mobile
            FROM 
                db_center_rbac.base_info_user_table 
            WHERE 
                user_mobile = '{}'
            ;""".format(user_mobile)
        # 查询出对应的数据
        query_base_info_user_table_data = db.findOne(query_base_info_user_table_sql)

        # 判断账户信息是否存在
        if not query_base_info_user_table_data:
            return create_response(code=400, msg="登录失败，未检测到对应的账户信息。")

        # 对密码进行加密操作
        encode_password = md5_encrypt(user_password)

        # 判断密码是否正确
        if query_base_info_user_table_data['user_pwds'] != encode_password:
            return create_response(code=400, msg="登录失败，密码输入错误。")

        # 判断账号状态是否关闭
        if int(query_base_info_user_table_data['user_status']) != 0:
            return create_response(code=400, msg="登录失败，当前账户信息已被冻结。")

        # 判断用户组信息
        query_base_info_role_table_sql = """
            SELECT  
                role_id, 
                role_status
            FROM 
                db_center_rbac.base_info_role_table
            WHERE 
                role_id = {}
            ;""".format(query_base_info_user_table_data['user_role_id'])
        # 获取用户组信息
        query_base_info_role_table_data = db.findOne(query_base_info_role_table_sql)

        # 判断用户组权限
        if int(query_base_info_role_table_data['role_status']) != 0:
            return create_response(code=400, msg="登录失败，用户组权限已被冻结。")

        # 判断用户组值是否存在
        if not query_base_info_role_table_data:
            return create_response(code=400, msg="登录失败，当前账户所在分组异常，请联系管理员处理。")

        # 获取所需的权限
        query_map_role_resource_table_sql = """
            SELECT 
                aas.resource_id,
                mrrt.resource_name,
                mrrt.resource_urls,
                mrrt.resource_rid,
                mrrt.resource_level 
            FROM 
                db_center_rbac.map_role_resource_table aas
            JOIN  
                db_center_rbac.base_info_resource_table mrrt 
            ON 
                aas.resource_id = mrrt.resource_id 
            WHERE 
                aas.role_id = {}
            ;""".format(query_base_info_role_table_data['role_id'])
        # 获取对应的数据
        query_map_role_resource_table_data = db.findAll(query_map_role_resource_table_sql)

        # 判断值
        if not query_map_role_resource_table_data:
            return create_response(code=400, msg="登录失败，当前用户组权限异常")

        # 生产token
        user_message_data = {
            "user_id": query_base_info_user_table_data['user_id'],
            "user_name": query_base_info_user_table_data['user_name'],
            "user_mobile": query_base_info_user_table_data['user_mobile']
        }
        # 对token
        token = jj.jwt_encode(user_message_data)
        # 进行第一次AES加密
        encode_token = aes_encrypt2(json.dumps(str(token)))

        # 将数据存入redis中
        r.set_str(1, f"background_token{encode_token}", str(token), 21600)

        # 组装树状数据
        role_resource_list = get_department_tree(query_map_role_resource_table_data)

        # 组装响应数据返回前端
        data = {
            "token": encode_token,
            "role_list": role_resource_list,
        }
        return create_response(code=200, msg="登录成功！", data=data)
